/*************************************************************************
 *                  HONGLING CAPITAL CONFIDENTIAL AND PROPRIETARY
 *
 *                COPYRIGHT (C) HONGLING CAPITAL CORPORATION 2012
 *    ALL RIGHTS RESERVED BY HONGLING CAPITAL CORPORATION. THIS PROGRAM
 * MUST BE USED  SOLELY FOR THE PURPOSE FOR WHICH IT WAS FURNISHED BY
 * HONGLING CAPITAL CORPORATION. NO PART OF THIS PROGRAM MAY BE REPRODUCED
 * OR DISCLOSED TO OTHERS,IN ANY FORM, WITHOUT THE PRIOR WRITTEN
 * PERMISSION OF HONGLING CAPITAL CORPORATION. USE OF COPYRIGHT NOTICE
 DOES NOT EVIDENCE PUBLICATION OF THE PROGRAM.
 *                  HONGLING CAPITAL CONFIDENTIAL AND PROPRIETARY
 *************************************************************************/

package com.springboot.service;

import com.springboot.dao.UserMapper;
import com.springboot.entity.User;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * 用户类业务层。
 *
 *  @CacheConfig(cacheNames="users") 注解指的是该类中的缓存的名称都是users
 *  @CachePut(key=" 'userCache' ")中userCache要加‘’单引号，表示这是一个字符串。
 *  @Cacheable能够根据方法的请求参数对其结果进行缓存(缓存的是方法的返回结果)，一般用于insert()操作
 *  @CachePut(key="'userCache'")主要针对方法配置，能够根据方法的请求参数对其结果进行缓存，和 @Cacheable 不同的是，它每次都会触发真实方法的调用，一般用于update()操作
 *  @CacheEvict(key="'userCache'")主要针对方法配置，能够根据一定的条件对缓存进行清空，一般用于delete（）操作
 *  本例中的@Cacheable和@CachePut和@CacheEvict的key值必须都是同一个缓存的key，因为这样当update的时候缓存的时候，get方法的得到的才是最新数据，而当删除的时候@CacheEvict，也必须把该key的缓存删除。
 *
 * @author hongchao zhao at 2019-4-19 11:27
 */
@Service
@CacheConfig(cacheNames = "usercache")
public class UserService {

    @Resource
    private UserMapper userMapper;

    /**
     * 新增用户信息。
     *
     * @param user 用户信息。
     */
    @Cacheable(key = "'userID#'+ #user.id")
    public User createUser(User user){
        userMapper.insert(user);
        return user;
    }

    /**
     * 根据用户编号获取用户信息。
     *
     * @param userID 用户编号。
     * @return 用户信息。
     */
    @Cacheable(key = "'userID#'+ #p0",unless = "#result == null")
    public User getUserById(Integer userID){
        return userMapper.selectByPrimaryKey(userID);
    }

    /**
     * 更新用户信息。
     *
     * @param user 用户信息。
     */
    @CachePut(key="'userID#'+ #user.id")
    public User updateUser(User user){
        userMapper.updateByPrimaryKey(user);
        return user;
    }

    /**
     * 删除用户信息。
     *
     * @param userID 用户编号。
     */
    @CacheEvict(key = "'userID#'+ #p0" ,beforeInvocation = true)
    public void deleteUserByID(Integer userID){
        userMapper.deleteByPrimaryKey(userID);
    }

}
